2023/12/235409字符

fs 文件操作

readFile 读取

const fs = require('fs');
const path = require('path');

const filename = path.resolve(__dirname, './data/pack.json');

// 1 同步读取文件
fs.readFile(filename, 'utf-8', (err, content) => {
    console.log(content);
});

// 2 异步读取文件
async function test () {
    const content = await fs.promises.readFile(filename, 'utf-8');  // ES6 之后为兼容之前的版本新增的 promises 方法
    console.log(content);
}
test();

writeFile 写入

const fs = require('fs');
const path = require('path');

const filename = path.resolve(__dirname, './data/1.txt');

async function test () {
    await fs.promises.writeFile(filename, 'hello');
    console.log('写入成功');
}
test();

文件复制

const fs = require('fs');
const path = require('path');

/**
 * 文件复制函数
 * @param {String} src1 被 copy 的文件路径
 * @param {String} src2 copy 的文件路径
 */
async function fileCopy (src1, src2) {
    const fromFilename = path.resolve(__dirname, src1);
    const buffer = await fs.promises.readFile(fromFilename);
    const toFilename = path.resolve(__dirname, src2);
    await fs.promises.writeFile(toFilename, buffer);
    console.log('文件复制成功');
}
fileCopy('./data/pack.json', './data/pack.copy.json');

mkdir 创建目录

fs.promises.mkdir('./test');
fs.promises.unlink(filename)

stat 读取文件状态信息

const fs = require('fs');
const path = require('path');

async function test () {
    const filename = path.resolve(__dirname, './data');
    const stat = await fs.promises.stat(filename);
    console.log(stat);
    console.log(stat.isDirectory());  //--> true  判断是否是目录
    console.log(stat.isFile());  //--> false  判断是否是文件
}
test();

判断该文件或目录是否已经存在,没有则创建该文件或目录

const fs = require('fs');
const path = require('path');

async function exists (filename) {
  const fileArr = filename.split(path.sep);
  const endFile = fileArr[fileArr.length - 1];
  // console.log(endFile)
  try {
      const stat = await fs.promises.stat(filename);  // 查看文件状态,判断是否存在
      return true;
    } catch (err) {
        if (err.code === 'EEXIST') {  // 目录或文件已存在
            return;
        } else if (err.code === 'ENOENT') {  // 文件不存在则创建该文件
            if (endFile.includes('.') === true) {  // 判断传入路径是否带有后缀名
                await fs.promises.writeFile(filename, '');
            } else {
                await fs.promises.mkdir(filename);
            }
            return false;
        }
        throw err;
    }
}
async function test () {
    const filename = path.resolve(__dirname, './data/1txt');
    const bool = await exists(filename);
    console.log(bool);
}
test();

获取文件夹下的内容

const fs = require('fs');
const path = require('path');

class File {
    constructor (filename, name, ext, isFile, size, createTime, updataTime) {
        this.filename = filename;
        this.name = name;
        this.ext = ext;
        this.isFile = isFile;
        this.size = size;
        this.createTime = createTime;
        this.updataTime = updataTime
    }

    // 获取文件内容
    async getContent (isBuffer = false) {
        if (this.isFile) {
            if (isBuffer) {
                return await fs.promises.readFile(this.filename);
            } else {
                return await fs.promises.readFile(this.filename, 'utf-8');
            }
        } else {
            return null;
        }
    }

    // 获取文件夹下的文件所有属性,返回一个数组
    async getChildren () {
        if (this.isFile) {
            return [];
        }
        let children = await fs.promises.readdir(this.filename);
        children = children.map(name => {
            const result = path.resolve(this.filename, name);
            return File.getFile(result);
        });
        return Promise.all(children);
    }
    
    // 获取文件属性
    static async getFile(filename) {
        const stat = await fs.promises.stat(filename);
        const name = path.basename(filename);
        const ext = path.extname(filename);
        const isFile = stat.isFile();
        const size = stat.size;
        const createTime = stat.birthtime;
        const updataTime = stat.mtime;

        return new File(filename, name, ext, isFile, size, createTime, updataTime);
    }
}

async function readDir (dirname) {
    const file = await File.getFile(dirname);
    return await file.getChildren();
}

// 获取一个文件夹下文件内容的字节数之和
async function getByteNum () {
    const filename = await path.resolve(__dirname, './data');
    const file = await File.getFile(filename);
    // console.log(file);
    // console.log(await file.getContent(true));
    // console.log(await readDir(filename));

    const arr = await readDir(filename);
    let byteNum = 0;
    await arr.forEach((val, i) => {
        byteNum += val.size;
    });
    console.log(byteNum);
}
getByteNum();